/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controller;

import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import modelo.Recurso;
import modelo.Reserva;
import modelo.Solicitudreserva;

/**
 *
 * @author Toshiba
 */
public interface SolicitudreservaControllerInterface {

    /**
     * Realiza la transaccion de usuario que se encarga de anular una solicitudreserva.
     * Para ello realiza el chequeo de todos los valores antes de realizar el matcheo con los
     * atributos del JPA de la Base de Datos
     * @return El tag de la pagina que lista las solicitudes reservas pendientes
     */
    String anular();

    /**
     * Obtiene el tag de la pagina de anulacion de una solicitudreserva
     * @return El tag de la pagina de anulacion de una solicitudreserva
     */
    String anularSetup();

    /**
     * Realiza la transaccion de usuario que se encarga de aporbar una solicitudreserva.
     * Para ello realiza el chequeo de todos los valores antes de realizar el matcheo con los
     * atributos del JPA de la Base de Datos
     * @return El tag de la pagina que lista las solicitudes reservas pendientes
     */
    String aprobar();

    /**
     * Obtiene el tag de la pagina de aprobacion de una solicitudreserva
     * @return El tag de la pagina de aprobacion de una solicitudreserva
     */
    String aprobarSetup();

    /**
     * Realiza la creacion de una nueva solicitud de reserva.
     * Para ello obtiene la clase instanciada de <code>solicitudreserva</code>
     * y a través del EntityManager realiza la operación de transacción
     * @return El tag donde se redireccionará la pagina actual despues de que haya terminado la transaccion
     */
    String create();

    /**
     * Metodo para inicializar los valores para el operador del Objeto Solicitudreserva para un nuevo objeto
     * @return el Tag del JSP para crear una nueva entrada de Solicitudreserva
     */
    String createSetup();

    /**
     * Metodo para inicializar los valores para el solicitante del Objeto Solicitudreserva para un nuevo objeto
     * @return el Tag del JSP para crear una nueva entrada de Solicitudreserva
     */
    String createSetupSolicitante();

    /**
     * Obtiene una SolicitudReserva con el id correspondiente.
     * @param id El idSolicitudReserva correspondiente
     * @return Solicitudreserva
     */
    Solicitudreserva findSolicitudreserva(Integer id);

    /**
     * Obtiene el mapeo del objeto actual en su representacion String
     * @return Mapeo de <code>Object, String</code>
     */
    Map<Object, String> getAsString();

    /**
     * Obtiene tamaño del buffer para desplegar la lista
     * @return El tamaño del buffer
     */
    int getBatchSize();

    /**
     * Obtiene el Administrador de Entidades.
     * @return EntityManager
     */
    EntityManager getEntityManager();

    /**
     * Obtiene la fecha y hora actual del sistema
     * @return La fecha y hora actual del sistema
     */
    Date getFechaHoraActual();

    /**
     * Obtiene el primer item de la Solicitudreserva
     * @return El primer item
     */
    int getFirstItem();

    /**
     * Obtiene el IdRecursoSeleccionado de la Solicitudreserva Controller
     * @return El IdRecursoSeleccionado
     */
    Recurso getIdRecursoSeleccionado();

    /**
     * Obtiene la cantidad de items de la Solicitudreserva
     * @return La cantidad de items
     */
    int getItemCount();

    /**
     * Obtiene el idSolicitudReserva maximo para la siguiente nueva solicitud
     * @return El idSolicitudreserva siguiente
     */
    int getItemMax();

    /**
     * Obtiene el ultimo item de la Solicitudreserva
     * @return El ultimo item
     */
    int getLastItem();

    /**
     * Obtiene una lista iterada de Recursos segun el tipo elegido en la solicitud
     * @return La lista iterada de recursos
     */
    List<Recurso> getRecursosPorTipo();

    /**
     * Obtiene una lista iterada de todos los Recursos disponibles segun el tipo elegido en la solicitud
     * @return La lista iterada de recursos
     */
    List<Recurso> getRecursosPorTipo(boolean all);

    /**
     * Obtiene una lista iterada de Recursos segun el tipo elegido en la solicitud
     * para poder ser desplegado en una lista seleccionable
     * @return La lista iterada de recursos
     */
    SelectItem[] getRecursosPorTipoAvailableSelectOne();

    /**
     * Obtiene una reservaCollectionList a la Solicitudreserva
     * @return Una reservaCollectionList de la Solicitudreserva
     */
    Reserva[] getReservaCollectionOfSolicitudreserva();

    /**
     * Obtiene la la Solicitudreserva si es que existe, y si no, crea una nueva instancia
     * @return La Solicitudreserva
     */
    Solicitudreserva getSolicitudreserva();

    /**
     * Getter de Solicitudreserva (atributo local).
     * @return List<Solicitudreserva>
     */
    List<Solicitudreserva> getSolicitudreservas();

    /**
     * Getter de todos los Solicitudreserva's (de la Base de Datos)
     * @param all
     * @return List<Solicitudreserva>
     */
    List<Solicitudreserva> getSolicitudreservas(boolean all);

    /**
     * Obtiene el listado de Solicitudreserva en una lista iterada
     * @return La lista de Solicitudreserva
     */
    SelectItem[] getSolicitudreservasAvailableSelectMany();

    /**
     * Metodo publico para obtener una lista de las Solicitudreserva's disponibles de una sola seleccion
     * @return lista de Solicitudreserva
     */
    SelectItem[] getSolicitudreservasAvailableSelectOne();

    /**
     * Obtiene la lista iterada de SolicitudReservas pendientes
     * @return La lista iterada de SolicitudReservas pendientes
     * Si el objeto actual es nulo, retorna la nueva lista de pendientes,
     * caso contrario, retorna la lista de pendientes actual
     */
    List<Solicitudreserva> getSolicitudreservasPendientes();

    /**
     * Obtiene la lista iterada de una Solicitudreserva pendinte
     * @param all Un boolean indicando que se recupere todos los valores
     * @return La lista iterada de pendientes
     */
    List<Solicitudreserva> getSolicitudreservasPendientes(boolean all);

    /**
     * Obtiene una lista iterada de solicitudes reserva pendientes del solicitante
     * Todas estas solicitudes pueden ser anuladas unicamente por el solicitante
     * @return La lista iterada de solicitudes reserva pendientes
     */
    List<Solicitudreserva> getSolicitudreservasPendientesSolicitante();

    /**
     * Obtiene la lista iterada de las solicitudes de reservas pendiente del solicitante seleccionado
     * @param all Un boolean indicando que se traera todas las solicitudes reservas pendientes
     * @return La lista iterada de pendientes
     */
    List<Solicitudreserva> getSolicitudreservasPendientesSolicitante(boolean all);

    /**
     * Metodo para resetear los valores de inicio y llamar al Tag de Lista de Solicitudreserva
     * @return el tag de la Lista de Solicitudreserva
     */
    String listSetup();

    /**
     * Resetea la referencia del objeto y retorna el tag de la siguiente pagina a desplegar
     * @return El tag de la siguiente pagina
     */
    String listSolicitudesPendientes();

    /**
     * Obtiene el tag de la pagina de solicitudes de reservas pendientes del solicitante
     * @return El tag de la pagina de solicitudes de reserva pendientes del solicitante
     */
    String listSolicitudesPendientesSetup();

    /**
     * Obtiene el tag de la pagina de solicitudes de reservas pendientes del aprobador
     * @return El tag de la pagina de solicitudes de reserva pendientes del aprobador
     */
    String listSolicitudesPendientesSolicitanteSetup();

    /**
     * Realiza la transaccion de usuario que se encarga de rechazar una solicitudreserva.
     * Para ello realiza el chequeo de todos los valores antes de realizar el matcheo con los
     * atributos del JPA de la Base de Datos
     * @return El tag de la pagina que lista las solicitudes reservas pendientes
     */
    String rechazar();

    /**
     * Obtiene el tag de la pagina de rechazo de una solicitudreserva
     * @return El tag de la pagina de rechazo de una solicitudreserva
     */
    String rechazarSetup();

    /**
     * Borra la referencia al objeto Representado (Borrado sin persistencia).
     * @param resetFirstItem
     */
    void reset(boolean resetFirstItem);

    /**
     * Fija el valor del recurso seleccionado al valor especificado
     * @param idRecursoSeleccionado El idRecursoSeleccionado
     */
    void setIdRecursoSeleccionado(Recurso idRecursoSeleccionado);

    /**
     * Fija una reservaCollectionList a la Solicitudreserva al valor especificado
     * @param reservaCollection La reservaCollection para la Solicitudreserva
     */
    void setReservaCollectionOfSolicitudreserva(Reserva[] reservaCollection);

    /**
     * Función que Vincula y Valida JSP con la Solicitudreserva representada.
     * @param facesContext El contexto del faces
     * @param component
     * @param value
     */
    void validateCreate(FacesContext facesContext, UIComponent component, Object value);

}
